/**
 * 本质上就是小红每3个回合打掉怪物4点血。
 * 因此可以预处理计算出杀死每个怪物所需的回合数，从而计算出对每个怪物的损失数。
 * 然后将怪物损失数从小到大排序，二分即可。
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>
using namespace __gnu_pbds;


using llt = long long;
using Real = double;
using vi = vector<int>;
using pii = pair<int, int>;

int N, H, K;
vi A, B;
int Q;
vi X;

int get(int a){
    int t = a / 4 * 3;
    switch(a % 4){
        case 0: return t - 1;
        case 1: case 2: return t + 1 - 1;
        case 3: return t + 2 - 1;
        default: assert(0); 
    }
    assert(0);
    return -1;
}

void proc(){
    vector<llt> lost(N, 0);
    for(int i=0;i<N;++i){
        lost[i] = (0LL + get(A[i])) * B[i];
    }

    vi rank(N, 0);
    for(int i=0;i<N;++i) rank[i] = i;
    sort(rank.begin(), rank.end(), [&](int i, int j){
        return lost[i] < lost[j];
    });

    vector<llt> vec(N + 1, 0);
    for(int i=1;i<=N;++i){
        vec[i] = vec[i - 1] + lost[rank[i - 1]];
    }

    for(auto x : X){
        llt t = H + (0LL + x) * K;
        auto pp = equal_range(vec.begin(), vec.end(), t);
        int p = 0;
        if(pp.first != pp.second){
            p = pp.first - vec.begin() - 1;
        }else{
            p = pp.second - vec.begin() - 1;
        }
        cout << p << " ";
    }
    cout << "\n";
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    int nofkase = 1;
    // cin >> nofkase;
    while(nofkase--){
        cin >> N >> H >> K;
        A.assign(N, {});
        B.assign(N, {});
        for(int i=0;i<N;++i) cin >> A[i] >> B[i];

        cin >> Q;
        X.assign(Q, {});
        for(auto & i : X) cin >> i;

        proc();
    }
    return 0;
}